package com.kaifamiao.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 测试结果集的可滚动特性
 */
public class JdbcTest04 {

    public static void main(String[] args) throws SQLException {

        DbHelper dh = new DbHelper();
        dh.load();
        Connection c = dh.connect();

        // 指定结果集的滚动类型为 可滚动结果集
        int resultSetType = ResultSet.TYPE_SCROLL_INSENSITIVE ;
        // 指定结果集的并发类型为 只读
        int resultSetConcurrency = ResultSet.CONCUR_READ_ONLY ;
        // 创建用于发送SQL给数据库服务器和接受数据库服务器返回结果的对象
        Statement st = c.createStatement( resultSetType , resultSetConcurrency );

        // 通过匿名类来实现接口中的抽象方法
        DbRowHandler h = new DbRowHandler() {
            @Override
            public void handle(ResultSet rs) throws SQLException {
                int eno = rs.getInt( "empno" );
                String name = rs.getString( "ename" );
                String job = rs.getString( "job" );
                double salary = rs.getDouble( "sal" );
                System.out.println( eno + "," + name + " , " + job + " , " + salary );
            }
        };

        String select = "SELECT empno , ename , job , sal FROM emp WHERE deptno = 20 ORDER BY empno ASC" ;
        ResultSet rs = st.executeQuery( select );

        // 从前往后依次处理结果集中的每行数据
        while( rs.next() ) {
            // 调用DbHelper中的方法处理结果集中的单行数据
            dh.processRow( rs , h );
        }

        System.out.println( "- - ".repeat( 10 ) );

        // 从后往前依次处理结果集中的每行数据
        while( rs.previous() ) {
            dh.processRow( rs , h );
        }

        System.out.println( "- - ".repeat( 10 ) );

        // 采用绝对定位的方式直接将"指针"定位到指定行
        rs.absolute(5 );
        dh.processRow( rs , h );

        System.out.println( "- - ".repeat( 10 ) );

        // rs.beforeFirst(); // 将"指针"移动到第一行之前
        rs.afterLast(); // 将"指针"移动到最后一行之后
        while ( rs.previous() ) {
            dh.processRow( rs , h );
        }

        dh.release( rs );
        dh.release( st );
        dh.release( c );

    }

}
